package com.sywl.hibernate;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 * jpa实体管理代理类
 * 该类主要代理 EntityManager 的 createQuery 方法
 * 在调用完该方法后 调用 query.setHint("org.hibernate.cacheable", true);
 * 使得查询支持从缓存查询
 * 因为即使在jpa配置文件中配置了使用查询缓存
 * 默认情况下，它还是不会与缓存打交道
 * 通过该代理对象，可以实现对所以的查询进行代理
 * 使其能够完全支持查询缓存，并且不会影响到现有代码
 * 注意：假如没有配置jpa二级缓存的话，会抛出异常
 * @author 林超
 * @see EntityManagerProxyAspect
 */
public class EntityManagerProxy implements InvocationHandler {

	EntityManager entityManager;
	
	public EntityManager getEntityManager() {
		return entityManager;
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public EntityManagerProxy() {
	}
	
	public EntityManagerProxy(EntityManager entityManager) {
		this.entityManager = entityManager;
	}
	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object obj = null;
		if(method.getName().equals("createQuery")) {
			Query query = (Query)method.invoke(entityManager, args);
			obj = query.setHint("org.hibernate.cacheable", true);
		} else {
			obj = method.invoke(entityManager, args);
		}
		return obj;
	}

}
